using dnAnalytics.Math;
using NUnit.Framework;

namespace dnAnalytics.Tests.Math
{
    [TestFixture]
    public class ComplexMath_PowTest
    {
        [Test]
        public void Pow()
        {
            Complex a = new Complex(1.19209289550780998537e-7, 1.19209289550780998537e-7);
            Complex b = new Complex(1.19209289550780998537e-7, 1.19209289550780998537e-7);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(9.99998047207974718744e-1, -1.76553541154378695012e-6), 8);
            a = new Complex(0.0, 1.19209289550780998537e-7);
            b = new Complex(0.0, -1.19209289550780998537e-7);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(1.00000018725172576491, 1.90048076369011843105e-6), 8);
            a = new Complex(0.0, -1.19209289550780998537e-7);
            b = new Complex(0.0, 5.0e-1);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(-2.56488189382693049636e-1, -2.17823120666116144959), 8);
            a = new Complex(0.0, 5.0e-1);
            b = new Complex(0.0, -5.0e-1);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(2.06287223508090495171, 7.45007062179724087859e-1), 8);
            a = new Complex(0.0, -5.0e-1);
            b = new Complex(0.0, 1.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(3.70040633557002510874, -3.07370876701949232239), 8);
            a = new Complex(0.0, 2.0);
            b = new Complex(0.0, -2.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(4.24532146387429353891, -2.27479427903521192648e1), 8);
            a = new Complex(0.0, -8.388608e6);
            b = new Complex(1.19209289550780998537e-7, 0.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(1.00000190048219620166, -1.87253870018168043834e-7), 8);
            a = new Complex(-1.19209289550780998537e-7, 0.0);
            b = new Complex(1.19209289550780998537e-7, 1.19209289550780998537e-7);
//            TestHelper.TestLogRelativeError(ComplexMath.Pow(a, b), new Complex(9.9999772501398737524e-1, -1.52596990796029252066e-6), 8);
            a = new Complex(1.19209289550780998537e-7, 1.19209289550780998537e-7);
            b = new Complex(1.19209289550780998537e-7, -1.19209289550780998537e-7);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(9.99998234460792594997e-1, 1.95278892568933630108e-6), 8);
            a = new Complex(1.19209289550780998537e-7, -1.19209289550780998537e-7);
            b = new Complex(-1.19209289550780998537e-7, 1.19209289550780998537e-7);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(1.00000195279272155185, -1.76554230700542567173e-6), 8);
            a = new Complex(-1.19209289550780998537e-7, 1.19209289550780998537e-7);
            b = new Complex(-1.19209289550780998537e-7, -1.19209289550780998537e-7);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(1.0000021400469319694, 1.5782887227319822572e-6), 8);
            a = new Complex(-1.19209289550780998537e-7, -1.19209289550780998537e-7);
            b = new Complex(1.19209289550780998537e-7, 5.0e-1);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(1.82048207798306990457e-1, -3.24307620835855028074), 8);
            a = new Complex(1.19209289550780998537e-7, 5.0e-1);
            b = new Complex(1.19209289550780998537e-7, -5.0e-1);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(2.06287167920797422826, 7.45007298088250109031e-1), 8);
            a = new Complex(1.19209289550780998537e-7, -5.0e-1);
            b = new Complex(-1.19209289550780998537e-7, 5.0e-1);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(2.06287229912678381546, -7.45006648647539965524e-1), 8);
            a = new Complex(-1.19209289550780998537e-7, 5.0e-1);
            b = new Complex(-1.19209289550780998537e-7, -5.0e-1);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(2.06287279095396722032, 7.45006826270870470906e-1), 8);
            a = new Complex(-1.19209289550780998537e-7, -5.0e-1);
            b = new Complex(1.19209289550780998537e-7, 1.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(3.70040633648973576176, -3.0737099387836770671), 8);
            a = new Complex(1.19209289550780998537e-7, 1.0);
            b = new Complex(1.19209289550780998537e-7, -1.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(4.81047680751171051403, 9.00778584383872064434e-7), 8);
            a = new Complex(1.19209289550780998537e-7, -1.0);
            b = new Complex(-1.19209289550780998537e-7, 1.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(4.81047680751171051401, 9.00778652744859086829e-7), 8);
            a = new Complex(-1.19209289550780998537e-7, 1.0);
            b = new Complex(-1.19209289550780998537e-7, -1.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(4.81047795441889248392, -9.00779004229257802805e-7), 8);
            a = new Complex(-1.19209289550780998537e-7, -1.0);
            b = new Complex(1.19209289550780998537e-7, 2.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(2.31406981499505779357e1, -4.33317704837467381982e-6), 8);
            a = new Complex(1.19209289550780998537e-7, 2.0);
            b = new Complex(1.19209289550780998537e-7, -2.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(4.24532556821343719351, -2.27479411632873741316e1), 8);
            a = new Complex(1.19209289550780998537e-7, -2.0);
            b = new Complex(-1.19209289550780998537e-7, 2.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(4.24531634737212140514, 2.27479389938842465821e1), 8);
            a = new Complex(-1.19209289550780998537e-7, 2.0);
            b = new Complex(-1.19209289550780998537e-7, -2.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(4.24531735953421017366, -2.2747944417416245858e1), 8);
            a = new Complex(-1.19209289550780998537e-7, -8.388608e6);
            b = new Complex(5.0e-1, 0.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(2.04799999999998544808e3, -2.04800000000001455192e3), 8);
            a = new Complex(-5.0e-1, 0.0);
            b = new Complex(5.0e-1, 1.19209289550780998537e-7);
//            TestHelper.TestLogRelativeError(ComplexMath.Pow(a, b), new Complex(5.84279165479569722374e-8, 7.07106516370135390697e-1), 8);
            a = new Complex(5.0e-1, 1.19209289550780998537e-7);
            b = new Complex(5.0e-1, -1.19209289550780998537e-7);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(7.07106781186563266789e-1, 1.42721635451415540181e-7), 8);
            a = new Complex(5.0e-1, -1.19209289550780998537e-7);
            b = new Complex(-5.0e-1, 1.19209289550780998537e-7);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(1.41421356237311419982, 5.17315171843250286477e-8), 8);
            a = new Complex(-5.0e-1, 1.19209289550780998537e-7);
            b = new Complex(-5.0e-1, -1.19209289550780998537e-7);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(2.85443377803337891375e-7, -1.41421409200602374123), 8);
            a = new Complex(-5.0e-1, -1.19209289550780998537e-7);
            b = new Complex(5.0e-1, 5.0e-1);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(-1.15541841519997588982, -3.19927364312925565319), 8);
            a = new Complex(5.0e-1, 5.0e-1);
            b = new Complex(5.0e-1, -5.0e-1);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(1.0511459897104246146, 6.67813825278960257194e-1), 8);
            a = new Complex(5.0e-1, -5.0e-1);
            b = new Complex(-5.0e-1, 5.0e-1);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(1.7189598149893848718, 3.8333216443146435741e-1), 8);
            a = new Complex(-5.0e-1, 5.0e-1);
            b = new Complex(-5.0e-1, -5.0e-1);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(2.07140248058937952289, -3.26040930589933104771), 8);
            a = new Complex(-5.0e-1, -5.0e-1);
            b = new Complex(5.0e-1, 1.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(4.09083312268613016524e-1, -8.86262979484208589882), 8);
            a = new Complex(5.0e-1, 1.0);
            b = new Complex(5.0e-1, -1.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(2.89184468869136961449, 1.36850553232463909129), 8);
            a = new Complex(5.0e-1, -1.0);
            b = new Complex(-5.0e-1, 1.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(2.25154230133625911883, 1.76607353802324005508), 8);
            a = new Complex(-5.0e-1, 1.0);
            b = new Complex(-5.0e-1, -1.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(3.09393187799682543573, -6.53791326174600512079), 8);
            a = new Complex(-5.0e-1, -1.0);
            b = new Complex(5.0e-1, 2.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(4.33516224515547153119e1, -4.41108378192366579843e1), 8);
            a = new Complex(5.0e-1, 2.0);
            b = new Complex(5.0e-1, -2.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(1.44136773287116337377e1, -1.43737200415563654774e1), 8);
            a = new Complex(5.0e-1, -2.0);
            b = new Complex(-5.0e-1, 2.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(-5.06837680441339154964, 8.47393286545916475625), 8);
            a = new Complex(-5.0e-1, 2.0);
            b = new Complex(-5.0e-1, -2.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(-1.85757451058788304534e1, -1.86273835390174169738e1), 8);
            a = new Complex(-5.0e-1, -8.388608e6);
            b = new Complex(1.0, 0.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(-5.0e-1, -8.388608e6), 8);
            a = new Complex(1.0, 1.19209289550780998537e-7);
            b = new Complex(1.0, -1.19209289550780998537e-7);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(1.00000000000001421085, 1.1920928955078184557e-7), 8);
            a = new Complex(1.0, -1.19209289550780998537e-7);
            b = new Complex(-1.0, 1.19209289550780998537e-7);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(1.0, 1.1920928955078184557e-7), 8);
            a = new Complex(-1.0, 1.19209289550780998537e-7);
            b = new Complex(-1.0, -1.19209289550780998537e-7);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(-1.00000037450706999844, -1.19209334195501897762e-7), 8);
            a = new Complex(-1.0, -1.19209289550780998537e-7);
            b = new Complex(1.0, 5.0e-1);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(-4.81047709423856470811, -5.73453573894732446896e-7), 8);
            a = new Complex(1.0, 5.0e-1);
            b = new Complex(1.0, -5.0e-1);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(1.2940879611878455755, 5.59164217163205818809e-1), 8);
            a = new Complex(1.0, -5.0e-1);
            b = new Complex(-1.0, 5.0e-1);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(9.79027320354617600278e-1, 5.59817470921882375292e-1), 8);
            a = new Complex(-1.0, 5.0e-1);
            b = new Complex(-1.0, -5.0e-1);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(-3.13243712712293303335, -1.35349899429781302247), 8);
            a = new Complex(-1.0, -5.0e-1);
            b = new Complex(1.0, 1.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(-1.36543645854238022036e1, -8.85290363761184112757), 8);
            a = new Complex(1.0, 1.0);
            b = new Complex(1.0, -1.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(2.80787929726062903957, 1.31786517290118086385), 8);
            a = new Complex(1.0, -1.0);
            b = new Complex(-1.0, 1.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(6.58932586450590431924e-1, 1.40393964863031451978), 8);
            a = new Complex(-1.0, 1.0);
            b = new Complex(-1.0, -1.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(-6.75361992397657144369, -3.16978030270156142359), 8);
            a = new Complex(-1.0, -1.0);
            b = new Complex(1.0, 2.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(-1.450221580753799496e1, -1.5675771544809202808e2), 8);
            a = new Complex(1.0, 2.0);
            b = new Complex(1.0, -2.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(1.79426068168389985952e1, -9.85549019536299976886), 8);
            a = new Complex(1.0, -2.0);
            b = new Complex(-1.0, 2.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(-3.72999124927875979445, 1.68815826725067980298), 8);
            a = new Complex(-1.0, 2.0);
            b = new Complex(-1.0, -2.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(-2.29273535787762074742e1, 1.25935049855290639346e1), 8);
            a = new Complex(-1.0, -8.388608e6);
            b = new Complex(2.0, 0.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(-7.0368744177663e13, 1.6777216e7), 8);
            a = new Complex(-2.0, 0.0);
            b = new Complex(2.0, 1.19209289550780998537e-7);
//            TestHelper.TestLogRelativeError(ComplexMath.Pow(a, b), new Complex(3.99999850197215368613, 3.30518208013296559626e-7), 8);
            a = new Complex(2.0, 1.19209289550780998537e-7);
            b = new Complex(2.0, -1.19209289550780998537e-7);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(4.00000000000003995641, 1.46318826408412115457e-7), 8);
            a = new Complex(2.0, -1.19209289550780998537e-7);
            b = new Complex(-2.0, 1.19209289550780998537e-7);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(2.49999999999995795812e-1, 5.04597181248646035514e-8), 8);
            a = new Complex(-2.0, 1.19209289550780998537e-7);
            b = new Complex(-2.0, -1.19209289550780998537e-7);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(2.50000093626771773244e-1, 9.1449300753655074337e-9), 8);
            a = new Complex(-2.0, -1.19209289550780998537e-7);
            b = new Complex(2.0, 5.0e-1);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(1.80978247631836073343e1, 6.53603847119075424092), 8);
            a = new Complex(2.0, 5.0e-1);
            b = new Complex(2.0, -5.0e-1);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(4.7643662627285056981, 6.14293657645256404233e-1), 8);
            a = new Complex(2.0, -5.0e-1);
            b = new Complex(-2.0, 5.0e-1);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(1.75188217791290995924e-1, 2.00102321413576003441e-1), 8);
            a = new Complex(-2.0, 5.0e-1);
            b = new Complex(-2.0, -5.0e-1);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(9.93167674872000831132e-1, 1.28054093662975414474e-1), 8);
            a = new Complex(-2.0, -5.0e-1);
            b = new Complex(2.0, 1.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(2.69288421203058133997e1, 7.21152386692625137958e1), 8);
            a = new Complex(2.0, 1.0);
            b = new Complex(2.0, -1.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(7.88966885164614827205, 9.71958872072081690308e-1), 8);
            a = new Complex(2.0, -1.0);
            b = new Complex(-2.0, 1.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(-5.10410704508689237391e-2, 3.13849223270419408578e-1), 8);
            a = new Complex(-2.0, 1.0);
            b = new Complex(-2.0, -1.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(2.88918880975100741709, 3.5593036279880811871e-1), 8);
            a = new Complex(-2.0, -1.0);
            b = new Complex(2.0, 2.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(-8.71330088091811080422e2, 6.02345829402297724033e2), 8);
            a = new Complex(2.0, 2.0);
            b = new Complex(2.0, -2.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(3.36119631223856976371e1, -1.87414050582462231776e1), 8);
            a = new Complex(2.0, -2.0);
            b = new Complex(-2.0, 2.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(-5.25186923787276525579e-1, -2.9283445403509723715e-1), 8);
            a = new Complex(-2.0, 2.0);
            b = new Complex(-2.0, -2.0);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(1.21531891781162373227e1, -6.77639209311391411895), 8);
            a = new Complex(-8.388608e6, -8.388608e6);
            b = new Complex(0.0, 1.19209289550780998537e-7);
            TestHelper.TestSignificantDigits(ComplexMath.Pow(a, b), new Complex(1.00000028087842538133, 1.94179574470475151246e-6), 8);
        }
    }
}